"""
犯罪记录控制器模块

该模块处理与犯罪记录相关的所有HTTP请求，包括创建、读取、更新和删除操作。
提供了统一的响应格式和错误处理机制。
"""

from robyn import SubRouter
from services import crimes_service
from constants import HttpStatus, DefaultValues, Role
from middleware.auth_middleware import auth_required
from utils.error_handler import unified_response, get_error_response, handle_database_error

# 创建犯罪记录子路由器
# 所有犯罪记录相关的API端点都将以/crimes为前缀
crimes_controller = SubRouter(__file__, prefix="/api/crimes")

@crimes_controller.post("/")
# @auth_required(required_roles=["admin","user"])
@auth_required()
async def addCrime(request):
    """
    创建新的犯罪记录
    
    HTTP方法: POST
    端点: /crimes/
    认证: 需要用户认证
    
    请求体:
        JSON格式的犯罪记录数据，包含犯罪相关的所有信息
    
    返回:
        成功: code=200, msg="Crime added successfully", data=新创建的犯罪记录
        失败: code=500, msg="Failed to add crime", error_info包含错误详情
    
    功能:
        - 接收JSON格式的犯罪记录数据
        - 调用服务层创建新的犯罪记录
        - 返回创建结果或错误信息
    
    错误处理:
        - 捕获所有异常并返回统一的错误响应
        - 支持调试模式下的详细错误信息
    """
    try:
        # 从请求体中获取JSON数据
        crime_data = request.json()
        
        # 调用服务层创建犯罪记录
        newCrime = crimes_service.createCrime(crime_data)
        
        # 检查创建结果
        if newCrime is None:
            return unified_response(HttpStatus.INTERNAL_SERVER_ERROR, "Crime not added", None)
        
        # 返回成功响应
        return unified_response(HttpStatus.OK, "Crime added successfully", newCrime)
    
    except Exception as e:
        # 捕获异常并返回错误响应
        return unified_response(HttpStatus.INTERNAL_SERVER_ERROR, "Failed to add crime", None, error=e)

@crimes_controller.get("/")
@auth_required()
async def getCrimes(request):
    """
    获取犯罪记录列表（支持分页）
    
    HTTP方法: GET
    端点: /crimes/
    认证: 需要用户认证
    
    查询参数:
        skip (int, optional): 跳过的记录数，默认为DefaultValues.SKIP
        limit (int, optional): 返回的记录数，默认为DefaultValues.LIMIT
    
    返回:
        成功: code=200, msg="Crimes retrieved successfully", data=犯罪记录列表
        失败: code=500, msg="Failed to retrieve crimes", error_info包含错误详情
    
    功能:
        - 支持分页查询，通过skip和limit参数控制
        - 调用服务层获取犯罪记录列表
        - 返回查询结果或错误信息
    
    参数处理:
        - skip参数默认为DefaultValues.SKIP，转换为整数
        - limit参数默认为DefaultValues.LIMIT，转换为整数
    
    错误处理:
        - 捕获参数转换异常
        - 捕获服务层异常并返回统一的错误响应
    """
    try:
        # 获取并转换分页参数
        skip = int(request.query_params.get("skip", DefaultValues.SKIP))
        limit = int(request.query_params.get("limit", DefaultValues.LIMIT))
        
        # 调用服务层获取犯罪记录列表
        crimes = crimes_service.getCrimes(skip=skip, limit=limit)
        
        # 返回成功响应
        return unified_response(HttpStatus.OK, "Crimes retrieved successfully", crimes)
    
    except Exception as e:
        # 捕获异常并返回错误响应
        return unified_response(HttpStatus.INTERNAL_SERVER_ERROR, "Failed to retrieve crimes", None, error=e)

@crimes_controller.get("/:crime_id")
@auth_required()
async def getCrime(request):
    """
    根据ID获取单个犯罪记录
    
    HTTP方法: GET
    端点: /crimes/{crime_id}
    认证: 需要用户认证
    
    路径参数:
        crime_id: 犯罪记录的唯一标识符
    
    返回:
        成功且找到记录: code=200, msg="Crime retrieved successfully", data=犯罪记录
        成功但未找到: code=404, msg="Crime not found", data=None
        失败: code=500, msg="Failed to retrieve crime", error_info包含错误详情
    
    功能:
        - 从路径参数中获取crime_id
        - 调用服务层根据ID查询犯罪记录
        - 根据查询结果返回相应的响应
    
    参数处理:
        - 从request.path_params中获取crime_id
    
    错误处理:
        - 处理记录不存在的情况（返回404）
        - 捕获服务层异常并返回统一的错误响应
    """
    try:
        # 从路径参数中获取犯罪记录ID
        crime_id = request.path_params.get("crime_id")
        
        # 调用服务层根据ID查询犯罪记录
        crimeModel = crimes_service.getCrime(crime_id)
        
        # 检查查询结果
        if crimeModel is None:
            # 记录不存在，返回404错误
            return unified_response(HttpStatus.NOT_FOUND, "Crime not found", None)
        
        # 返回成功响应
        return unified_response(HttpStatus.OK, "Crime retrieved successfully", crimeModel)
    
    except Exception as e:
        # 捕获异常并返回错误响应
        return unified_response(HttpStatus.INTERNAL_SERVER_ERROR, "Failed to retrieve crime", None, error=e)

@crimes_controller.put("/:crime_id")
@auth_required()
async def updateCrime(request):
    """
    更新犯罪记录
    
    HTTP方法: PUT
    端点: /crimes/{crime_id}
    认证: 需要用户认证
    
    路径参数:
        crime_id: 要更新的犯罪记录的唯一标识符
    
    请求体:
        JSON格式的更新数据，包含需要修改的字段
    
    返回:
        成功且找到记录: code=200, msg="Crime updated successfully", data=更新后的犯罪记录
        成功但未找到: code=404, msg="Crime not found", data=None
        失败: code=500, msg="Failed to update crime", error_info包含错误详情
    
    功能:
        - 从路径参数中获取crime_id
        - 从请求体中获取更新数据
        - 调用服务层更新犯罪记录
        - 根据更新结果返回相应的响应
    
    参数处理:
        - 从request.path_params中获取crime_id
        - 从request.json()中获取更新数据
    
    错误处理:
        - 处理记录不存在的情况（返回404）
        - 捕获服务层异常并返回统一的错误响应
    """
    try:
        # 从路径参数中获取犯罪记录ID
        crime_id = request.path_params.get("crime_id")
        
        # 从请求体中获取更新数据
        crime_data = request.json()
        
        # 调用服务层更新犯罪记录
        updatedCrime = crimes_service.updateCrime(crime_id, crime_data)
        
        # 检查更新结果
        if updatedCrime is None:
            # 记录不存在，返回404错误
            return unified_response(HttpStatus.NOT_FOUND, "Crime not found", None)
        
        # 返回成功响应
        return unified_response(HttpStatus.OK, "Crime updated successfully", updatedCrime)
    
    except Exception as e:
        # 捕获异常并返回错误响应
        return unified_response(HttpStatus.INTERNAL_SERVER_ERROR, "Failed to update crime", None, error=e)

@crimes_controller.delete("/:crime_id")
@auth_required()
async def deleteCrime(request):
    """
    删除犯罪记录
    
    HTTP方法: DELETE
    端点: /crimes/{crime_id}
    认证: 需要用户认证
    
    路径参数:
        crime_id: 要删除的犯罪记录的唯一标识符
    
    返回:
        成功且找到记录: code=200, msg="Crime deleted successfully", data=None
        成功但未找到: code=404, msg="Crime not found", data=None
        失败: code=500, msg="Failed to delete crime", error_info包含错误详情
    
    功能:
        - 从路径参数中获取crime_id
        - 调用服务层删除犯罪记录
        - 根据删除结果返回相应的响应
    
    参数处理:
        - 从request.path_params中获取crime_id
    
    错误处理:
        - 处理记录不存在的情况（返回404）
        - 捕获服务层异常并返回统一的错误响应
    
    注意:
        - 删除操作是不可逆的，需要谨慎处理
        - 建议在实际应用中添加软删除机制
    """
    try:
        # 从路径参数中获取犯罪记录ID
        crime_id = request.path_params.get("crime_id")
        
        # 调用服务层删除犯罪记录
        isDeleted = crimes_service.deleteCrime(crime_id)
        
        # 检查删除结果
        if not isDeleted:
            # 记录不存在或删除失败，返回404错误
            return unified_response(HttpStatus.NOT_FOUND, "Crime not found", None)
        
        # 返回成功响应
        return unified_response(HttpStatus.OK, "Crime deleted successfully", None)
    
    except Exception as e:
        # 捕获异常并返回错误响应
        return unified_response(HttpStatus.INTERNAL_SERVER_ERROR, "Failed to delete crime", None, error=e)